package com.newer.biz.sys.auth.impl;

import com.newer.biz.sys.auth.ShiroBiz;
import com.newer.commons.constants.CommonConstants;
import com.newer.commons.result.BizResult;
import com.newer.dao.bean.sys.Menu;
import com.newer.dao.bean.sys.MenuPermission;
import com.newer.dao.bean.sys.User;
import com.newer.dao.bean.sys.UserRole;
import com.newer.dao.mapper.sys.*;
import com.newer.utils.ConvertMenuUtils;
import org.apache.commons.collections.CollectionUtils;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.util.List;

/**
 * Shiro配置相关业务操作
 * <p>
 * Created by 寻添俊 on 2016/10/21.
 */
@Component
public class ShiroBizImpl implements ShiroBiz {

    /**
     * 日志信息打印
     */
    Logger logger = LogManager.getLogger(this.getClass());

    /**
     * 权限相关数据库操作
     */
    @Autowired
    UserMapper userMapper;

    /**
     * 菜单信息相关数据库操作
     */
    @Autowired
    MenuMapper menuMapper;

    /**
     * 用户角色数据库操作
     */
    @Autowired
    UserRoleMapper userRoleMapper;


    /**
     * 用户菜单数据库操作
     */
    @Autowired
    RoleMenuMapper roleMenuMapper;

    /**
     * 菜单权限数据库操作
     */
    @Autowired
    MenuPermissionMapper menuPermissionMapper;

    /**
     * 用户登录服务
     *
     * @param loginName
     * @return
     */
    @Override
    public BizResult<User> userLogin(String loginName) {
        BizResult<User> bizResult = new BizResult<>();
        try {
            User user = userMapper.selectByLoginName(loginName);
            if (user == null) {
                bizResult.setMsg("用户登录失败,用户名密码错误.");
                return bizResult;
            }
            bizResult.setSuccess(true);
            bizResult.setResult(user);
        } catch (Exception e) {
            logger.error("用户登录失败,失败原因:" + e.getCause(), e);
            bizResult.setMsg("用户登录失败,请联系开发人员.");
        }
        return bizResult;
    }

    /**
     * 获取用户所拥有的角色
     *
     * @param userId
     * @return
     */
    @Override
    public BizResult<UserRole> findUserRoles(String userId) {
        BizResult<UserRole> bizResult = new BizResult<>();
        try {
            // 查询用户所用的权限
            List<UserRole> userRoles = userRoleMapper.selectUserRoles(userId);
            if (CollectionUtils.isEmpty(userRoles)) {
                bizResult.setMsg("角色信息为空.");
                return bizResult;
            }
            bizResult.setSuccess(true);
            bizResult.setResults(userRoles);
        } catch (Exception e) {
            logger.error("查询用户角色信息失败,失败原因:" + e.getCause(), e);
            bizResult.setMsg("查询用户角色信息失败,请联系开发人员.");
        }
        return bizResult;
    }

    /**
     * 查询用户所拥有的菜单信息
     *
     * @param userRoles
     * @return
     */
    @Override
    public BizResult<Menu> findUsersMenus(List<UserRole> userRoles) {
        BizResult<Menu> bizResult = new BizResult<>();
        try {
            // 查询用户所拥有的菜单ID集合
            List<String> menuIds = roleMenuMapper
                    .selectMenuIdsByRoles(userRoles);
            // 根据菜单Id集合查询菜单信息
            if (CollectionUtils.isNotEmpty(menuIds)) {
                List<Menu> menus = menuMapper.selectMenusByIds(menuIds, CommonConstants.IS_MENU);
                List<Menu> convertMenus = ConvertMenuUtils.converMenusRecurrence(menus, CommonConstants.MENU_ROOT_ID);
                bizResult.setResults(convertMenus);
            }
            bizResult.setSuccess(true);
        } catch (Exception e) {
            logger.error("查询用户所拥有的菜单信息,失败原因:" + e.getCause(), e);
            bizResult.setMsg("查询用户所拥有的菜单信息,请联系开发人员.");
        }
        return bizResult;
    }


    /**
     * 根据菜单ID查询访问菜单所需要的权限信息
     *
     * @param menuId
     * @return
     */
    @Override
    public BizResult<MenuPermission> findMenuPermsByMenuId(String menuId) {
        BizResult<MenuPermission> bizResult = new BizResult<>();
        try {
            // 查询用户所拥有的菜单ID集合
            List<MenuPermission> menuPermissions = menuPermissionMapper
                    .selectByMenuId(menuId);
            bizResult.setResults(menuPermissions);
            bizResult.setSuccess(true);
        } catch (Exception e) {
            logger.error("根据菜单ID查询访问菜单所需要的权限信息,失败原因:" + e.getCause(), e);
            bizResult.setMsg("根据菜单ID查询访问菜单所需要的权限信息失败,请联系开发人员.");
        }
        return bizResult;
    }

}
